package cn.tedu.toa.management.sys.service.impl;

import cn.tedu.toa.management.sys.entity.SysMenus;
import cn.tedu.toa.management.sys.entity.SysRoles;
import cn.tedu.toa.management.sys.mapper.SysMenusMapper;
import cn.tedu.toa.management.sys.mapper.SysRolesMapper;
import cn.tedu.toa.management.sys.service.SysRolesService;
import cn.tedu.toa.management.sys.service.ex.*;
import cn.tedu.toa.management.sys.vo.RoleVo;
import cn.tedu.toa.management.util.UserUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 角色 服务实现类
 * </p>
 *
 * @author huaqian
 * @since 2021-09-09
 */
@Service
public class SysRolesServiceImpl extends ServiceImpl<SysRolesMapper, SysRoles> implements SysRolesService {

    @Autowired
    SysRolesMapper sysRolesMapper;

    @Autowired
    SysMenusMapper sysMenusMapper;


    @Override
    public PageInfo<SysRoles> findRoleList(String roleName, Integer pageNum, Integer pageSize) {
        //参数是否合法
        if(pageNum==null || pageSize==null){
            throw new ParamIllegelException("查询角色列表异常!查询页码或煤业显示页数不合法!");
        }
        //使用PageHelper完成分页
        PageHelper.startPage(pageNum,pageSize);
        //调用持久层查询列表
        List<SysRoles> list=sysRolesMapper.selectRoleList(roleName);
        //查询到列表封装到PageInfo对象中,并返回
        PageInfo<SysRoles> pageInfo= new PageInfo<>(list);
        return pageInfo;
    }

    @Transactional
    public void saveRole(SysRoles roles, Integer[] menuIds) {
        //先判断参数
        if(roles==null || roles.getName().isEmpty()){
            throw new ParamIllegelException("添加角色异常!角色信息为空或角色名称为空");
        }
        //判断menuIds中的菜单中是否真实存在
        int count=sysMenusMapper.selectCountByMenuIds(menuIds);
        if(count!=menuIds.length){
            throw new RecordNotFoundException("添加角色异常!关联的菜单可能不存在!");
        }
        //补全角色数据,向数据库插入数据
        roles.setCreatedTime(LocalDateTime.now())
                .setModifiedTime(LocalDateTime.now())
                .setCreatedUser(UserUtils.getCurrentUserName())
                .setModifiedUser(UserUtils.getCurrentUserName());
        //天机角色和菜单关联关系
       int row= sysRolesMapper.insert(roles);
       if(row!=1){
           throw new InsertException("添加角色失败!");
       }
       row=sysRolesMapper.insertRoleMenus(roles.getId(),menuIds);
       if(row!=menuIds.length){
           throw new InsertException("添加角色菜单信息异常! ");
       }
    }

    @Transactional
    public void delRole(Integer roleId){
        //先判断role id是否存在
        if(roleId==null || roleId<0){
            throw new ParamIllegelException("删除角色异常!角色id不合法!");
        }
        //该角色是否存在
        SysRoles roles=sysRolesMapper.selectById(roleId);
        if(roles==null){
            throw new RecordNotFoundException("删除角色异常!该角色不存在!");
        }
        //删除用户角色表
        Integer row=sysRolesMapper.selectSysUserRolesByRoleId(roleId);
        if(row!=0){
            throw new IllegalOperationException("删除角色异常!该角色有用户使用,请先删除用户或更改角色!");
        }
        //该角色是否在用户角色表存在
         List<Integer> menuIds=sysRolesMapper.selectSysRoleMenusByRoleId(roleId);
        if(menuIds.size()!=0){
           Integer rowRoleMenu=sysRolesMapper.delSysRoleMenus(roleId);
            if(menuIds.size()!=rowRoleMenu){
                throw new DeleteException("删除角色菜单记录出现异常!");
            }
        }
        //删除角色
        row=sysRolesMapper.delRole(roleId);
        if(row!=1){
            throw new DeleteException("删除角色记录出现异常!");
        }

    }

    @Override
    @Transactional
    public void updateRole(SysRoles roles,Integer[] menuIds) {
        //先确保 roleId存在
        if(roles==null || roles.getId()==null || roles.getName()==null){
            throw new ParamIllegelException("修改角色异常!角色参数不合法!");
        }
        //确认 roles 存在   menuIds 存在
        SysRoles  sysRoles=sysRolesMapper.selectById(roles.getId());
        if(sysRoles==null){
            throw new ParamIllegelException("修改角色异常!角色不存在!");
        }

        int num=sysMenusMapper.selectCountByMenuIds(menuIds);
        if(num!=menuIds.length){
            throw new ParamIllegelException("修改角色异常!菜单Id不存在!");
        }
        //组装SysRoles
        sysRoles.setName(roles.getName()).setNote(roles.getNote())
                .setModifiedTime(LocalDateTime.now()).setModifiedUser(UserUtils.getCurrentUserName());
        //先更新 role 中的表
         num=sysRolesMapper.updateById(sysRoles);
        if(num!=1){
            throw new UpdateException("修改角色异常!更新角色表出现异常!");
        }
        //sys_role_menus 更新数据  先删除再插入
        List<Integer> list=sysRolesMapper.selectSysRoleMenusByRoleId(sysRoles.getId());
        num=sysRolesMapper.delSysRoleMenus(sysRoles.getId());
       if(num!=list.size()){
           throw new DeleteException("修改角色异常!删除菜单角色表异常!");
       }
        num=sysRolesMapper.insertRoleMenus(sysRoles.getId(),menuIds);
        if(num!=menuIds.length){
            throw new InsertException("修改角色异常!添加菜单角色表异常!");
        }

    }

    @Override
    public RoleVo selectRoleMenusByRoleId(Integer roleId) {
        //先判断roleId是否存在
        if(roleId<=0 && roleId!=null){
            throw new ParamIllegelException("修改角色异常!角色id不合法");
        }
        //查询roleId 是否存在
        SysRoles roles=sysRolesMapper.selectById(roleId);
        if(roles==null){
            throw new ParamIllegelException("修改角色异常!角色id不存在");
        }
        //
        List<Integer> menuIds=sysRolesMapper.selectSysRoleMenusByRoleId(roleId);
        RoleVo roleVo=new RoleVo().setMenuIds(menuIds).setName(roles.getName()).setNote(roles.getNote());
        return roleVo;
    }

    @Override
    public List<SysRoles> findAllRoles() {
        List<SysRoles> sysRoles=sysRolesMapper.selectRoleList(null);
        if(sysRoles==null){
            throw new RecordNotFoundException("角色信息找不到异常!");
        }
        return sysRoles;
    }



}
